//给定一个字符串，按照字母、数字、符号的顺序重新排列
//并且不改变原有的排列顺序

#include <iostream>
#include <cstring>
using namespace std;

/**
    思考：
        按照---字母--数字--符号
        根据冒泡法进行实现
        对于数组中的字符两两比较
        ompare(a,b)
             |字母|数字|其他|
        |字母| 0  |  1  | 1  |
        |数字| -1 | 0   | 1  |
        |其他| -1 |  -1 | 0  |
        结果是-1的要交换
        进行多次比较，因为每次比较就会更加贴近结果，
        直到比较一次循环比较，没有发生交换，则比较完毕
*/
int charType(char ch);
int compare(char ch1,char ch2);
int parseStr(char * str)
{
    int flag=0;
    int len = strlen(str);
    do
    {
        //两两比较
        flag = 0;
        for(int i = 0;i<len;i++)
        {
            if(compare(str[i],str[i+1])<0)
            {
                flag = 1;
                int tmp = str[i];
                str[i] = str[i+1];
                str[i+1] = tmp;
            }
        }
    }while(flag);
}

//判断一个字符是不是字母(1),数字(-1),其他(0)
int charType(char ch)
{
    if((ch>='a' && ch<='z') || (ch>='A'&&ch<='Z'))
    {
        return 1;
    }else if(ch>='0' && ch <='9')
    {
        return -1;
    }else
    {
        return 0;
    }
}

int compare(char ch1,char ch2)
{
    //字母，数字，其他  1  -1  0
    if(charType(ch1)==1)
    {
        if(charType(ch2)==1)
        {
            return 0;
        }else
        {
            return 1;
        }
    }
    if(charType(ch1)==-1)
    {
        if(charType(ch2)==1)
        {
            return -1;
        }
        if(charType(ch2)==-1)
        {
            return 0;
        }
        if(charType(ch2)==0)
        {
            return 1;
        }
    }
    if(charType(ch1)==0)
    {
        if(charType(ch2)==0)
        {
            return 0;
        }else
        {
            return -1;
        }
    }
}
int main()
{
    char ch[] = "a123bc$$&de456fg**98s#";
    parseStr(ch);
    cout<<"重排："<<ch<<endl;

    system("pause");
    return 0;
}
